Introduction

The Polish parliament serves as a vibrant arena for political discourse, where members engage in various forms of communication to address pressing issues and hold the government accountable. One such crucial mechanism is interpellation, where parliamentarians pose questions to government officials, seeking clarifications or initiating discussions on policies, decisions, or matters of public concern.

Purpose of the project

This text mining project focusing on interpellation within the Polish parliament integrates a analytical approach of network analysis. Through network analysis, I aim to map the intricate relationships among parliamentarians based on their interpellation activities, unveiling patterns of collaboration, influence, and ideological alignment within the legislative body. By examining the network structure, centrality measures, and clustering tendencies, I seek to elucidate the underlying dynamics of political discourse and coalition-building strategies.

Main assumptions

  1. There exists a core group of parliamentarians who are consistently central to the interpellation network, indicating their significant role in shaping debates, garnering support for policies, and influencing legislative outcomes.
  2. There is a tendency for same party members to be close in text network.

Data

Description of the data set

Data comes from The Polish Parliamentary Corpus / Korpus Dyskursu Parlamentarnego repository. That repository contains both Sejm and Senat proceedings, interpellation etc. from 1919 to 2023. The analysis is limited to 3 parliament terms (1997-2001, 2001-2005 and 2005-200) and only to data from Member of Parliament interpellations. Based on the files stored in that repository the dataset for the analysis (both the content and available metadata) has been created and preprocessed before the analysis via external scripts link to reposiotry of this project). To stem data KRNNT tool was used. Preprocessed files are available on Google Drive.

Preparation of data for modeling

There will be three main steps:

  • retrieve date of interpellation since it was available in metadata
  • make sure author is ok - it is needed for proper network analysis
  • clean stemmed data

Load data

First step - load data from preprocessed files

pi_files <- list.files("data", pattern = "^(pi_)")
all_pi <- do.call(rbind, 
                  lapply(X = pi_files, FUN = function(i){
                    mydb <- dbConnect(RSQLite::SQLite(), file.path("data", i))
                    this_cont <- dbGetQuery(conn = mydb, 
                                            statement = "select metadata.*, ipcontent.content from ipcontent left join metadata on metadata.id = ipcontent.id")
                    dbDisconnect(mydb)
                    this_cont$period <- gsub("pi_", replacement = "", x = gsub(pattern = ".sqlite", replacement = "", x = i))
                    this_cont
                  }))
# add information about length of each document
all_pi <- all_pi %>% 
  mutate(len = nchar(CONTENT))

# create dataset with start and end of each period
period_bands <- data.frame(period = c("1997-2001", "2001-2005", "2005-2007"), 
                           start_date = as.Date(c("1997-10-20", "2001-10-19", "2005-10-19")),
                           end_date = as.Date(c("2001-10-18", "2005-10-18", "2007-09-07")))

Create date of interpellation

Second step - create date of creation of each interpellation

# assumption - each document ends in date passed in that format: <day> <month as a word> <year>
last_part_len <- 24
vec_to_extract_dates <- all_pi$CONTENT %>% substr(start = nchar(.) - last_part_len, nchar(.))
# there are some cases that will be overwritten and not treated with general approach (59 out of 28074 [0.2%]):
#   because the last part of document did not include date (e.g. it consists of footnotes of some sort)
#   because there were mistakes (e.g. year 3000)
list_exceptions <- jsonlite::fromJSON(txt = "dicts/pi_dates.json")
vec_to_extract_dates[match(x = names(list_exceptions), table = all_pi$DOC)] <- unlist(list_exceptions)

# remove last part of date
vec_to_extract_dates <- gsub(pattern = "(r|roku)\\s*\\.*\\,*$", replacement = "", x = vec_to_extract_dates)
vec_to_extract_dates <- trimws(vec_to_extract_dates)
# extract year
years <- as.numeric(substr(vec_to_extract_dates, regexpr(pattern = "\\d+\\.*$", text = vec_to_extract_dates), nchar(vec_to_extract_dates)))
# check if everything is ok
if (any(is.na(years))) {
  idx <- which(is.na(years))
  message(length(idx))
  vec_to_extract_dates[idx[1:min(10, length(idx))]]
}

if (!all(years %in% c(1997:2007))) {
  idx <- which(!years %in% c(1997:2007))
  message(length(idx))
  vec_to_extract_dates[idx[1:min(10, length(idx))]]
}

# remove year to ease the process
vec_to_extract_dates <- trimws(substr(vec_to_extract_dates, 1, nchar(vec_to_extract_dates) - 4))
# extract month
months_vec <- rep(0, length = length(vec_to_extract_dates))
months_dict <- list("1" = "stycznia",
                    "2" = c("lutego", "luty"),
                    "3" = "marca",
                    "4" = c("kwietnia", "kwietnie", "kwitnia", "kwietna"),
                    "5" = "maja",
                    "6" = "czerwca",
                    "7" = "lipca", 
                    "8" = "sierpnia",
                    "9" = c("września", "wrzesień"),
                    "10" = "października",
                    "11" = c("listopada", "listopad"),
                    "12" = "grudnia")

for (m in 1:length(months_dict)) {
  vals <- regexpr(pattern = sprintf("(%s)", paste0(months_dict[[m]], collapse = "|")), text = vec_to_extract_dates)
  idx <- which(vals > 0)
  months_vec[idx] <- as.numeric(names(months_dict)[m])
  vec_to_extract_dates[idx] <- substr(vec_to_extract_dates[idx], 1, vals[idx] -1)
}

# check if everything is ok
if (!all(months_vec %in% c(1:12))) {
  idx <- which(!months_vec %in% c(1:12))
  message(length(idx))
  vec_to_extract_dates[idx[1:min(10, length(idx))]]
}

vec_to_extract_dates <- trimws(vec_to_extract_dates)
# extract day
days_vec <- as.numeric(substr(vec_to_extract_dates, regexpr(pattern = "\\d+$", text = vec_to_extract_dates), nchar(vec_to_extract_dates)))

# check if everything is ok
if (!all(days_vec %in% c(1:31))) {
  idx <- which(!days_vec %in% c(1:31))
  message(length(idx))
  vec_to_extract_dates[idx[1:min(10, length(idx))]]
}

# add to dataset
all_pi$date <- as.Date(sprintf("%s-%02d-%02d", years, months_vec, days_vec))

Check if all is ok - each date should be between start and end of each period

all_pi %>% 
  left_join(y = period_bands, by = "period") %>% 
  mutate(days_after_start = as.numeric(date - start_date)) %>% 
  filter(days_after_start < 0) %>% 
  kable() %>%
    kable_styling()
ID AUTHOR DOC CONTENT period len date start_date end_date days_after_start
NA NA NA NA NA NA NA NA NA NA
–: :—— :— :——- :—— —: :—- :———- :——– —————-:

But sometimes interpellation is written in a period t is delivered to Sejm in period t-1.

all_pi %>% 
  left_join(y = period_bands, by = "period") %>% 
  mutate(days_before_end = as.numeric(end_date - date)) %>% 
  filter(days_before_end < 0) %>% 
  summarise(n(), min(days_before_end), median(days_before_end), max(days_before_end)) %>% 
  kable() %>%
    kable_styling()
n() min(days_before_end) median(days_before_end) max(days_before_end)
31 -172 -11 -1

Clean up authors

Third step - cleaning up data regarding author of interpellation

all_pi %>% group_by(period) %>% 
  summarise(n_authors = length(unique(AUTHOR))) %>% 
  kable() %>% 
  kable_styling()
period n_authors
1997-2001 559
2001-2005 687
2005-2007 686

This is strange, those supposed to be parliamentary interpellations. In Polish Sejm there is 460 members, but data for each term suggest there are many more of them.

Couple things to consider:

  • member of parliament was sometimes described with first and second name (‘Adam Bielan’ and ‘Adam Jerzy Bielan’ is the same person)
  • couple of members cosign one interpellation (e.g. ‘Adam Bielan i Zbigniew Ziobro’)
  • in course of term member’s list might change due to different things (death, resigning etc.)

Load the member list. This is a list of member for each term at the end of the term.

# for further analysis
posl_json <- jsonlite::fromJSON(txt = "dicts/poslowie.json")
posl_df <- do.call(rbind, 
                   lapply(names(posl_json),
                          FUN = function(i){
                            posl_json_period <- posl_json[[i]]
                            posl_df <- do.call(rbind,
                                               lapply(1:length(posl_json_period), 
                                                      FUN = function(j){
                                                        nn <- names(posl_json_period)[j]
                                                        ps <- unlist(posl_json_period[[nn]])
                                                        data.frame(AUTHOR = ps, ugr = names(posl_json_period)[j])
                                                      }))
                            row.names(posl_df) <- NULL
                            posl_df$period <- i
                            posl_df
                          }))

Is everything is ok with that data?

posl_df %>% 
  group_by(period) %>% 
  summarise(n = n(), uq = length(unique(AUTHOR)), any_duplicates = n > uq, duplicate_members = paste0(AUTHOR[duplicated(AUTHOR)], collapse = ", ")) %>% 
  kable() %>% 
  kable_styling()
period n uq any_duplicates duplicate_members
1997-2001 460 459 TRUE Maciej Jankowski
2001-2005 460 459 TRUE Ewa Janik
2005-2007 460 460 FALSE

There are duplicates in two periods. Let see how many interpellations are for those members.

all_pi %>% filter(regexpr(text = AUTHOR, pattern = "(Ewa Janik)|(Maciej Jankowski)") > 0) %>% 
  group_by(period, AUTHOR) %>% summarise(n()) %>% 
  kable() %>% 
  kable_styling()
period AUTHOR n()
1997-2001 Ewa Janik 29
1997-2001 Ewa Janik i Seweryn Kaczmarek 2
1997-2001 Ewa Janik i Władysław Szkop 2
1997-2001 Maciej Jankowski 2
2005-2007 Ewa Janik 3

Apparently there are only 2 (out of 28k) observations are for the periods where there are mulitple names on member list. For simplicity I’ll remove one of those members.

posl_df <- posl_df %>% filter(!(AUTHOR == "Maciej Jankowski" & ugr == "Posłowie niezrzeszeni" & period == "1997-2001"))
posl_df <- posl_df %>% filter(!(AUTHOR == "Ewa Janik" & period == "2001-2005"))
posl_df <- rbind(posl_df, data.frame(AUTHOR = "Ewa Janik", period = "2001-2005", ugr = "Klub Parlamentarny Sojuszu Lewicy Demokratycznej"))

Check how many interpellations are not accounted for author’s party

all_pi %>% 
  left_join(posl_df, by = c("AUTHOR", "period")) %>% 
  group_by(period) %>% 
  summarise(n_mem = n_distinct(AUTHOR), count = n(), without_party = sum(is.na(ugr)) / count, 
            n_mem_without_party = length(unique(AUTHOR[is.na(ugr)])), without_part_count = n_mem_without_party / n_mem) %>% 
  kable() %>% 
  kable_styling()
period n_mem count without_party n_mem_without_party without_part_count
1997-2001 559 7444 0.1575766 276 0.4937388
2001-2005 687 10906 0.1444159 322 0.4687045
2005-2007 686 9724 0.2317976 317 0.4620991
  • good news: between 1 in 7 and 1 in 5 interpollation is not accounted for auther (not great, not terrible) (column without_party)
  • bad news: half of authors are not recognized (column without_part_count)

Let see which authors do not rest in posel list

all_pi %>%  
  left_join(posl_df, by = c("AUTHOR", "period")) %>% 
  group_by(AUTHOR, ugr) %>% 
  summarise(k = n()) %>% 
  filter(is.na(ugr)) %>% 
  head() %>% 
  kable() %>% 
  kable_styling()
AUTHOR ugr k
Adam Bielan NA 6
Adam Bielan i Zbigniew Ziobro NA 4
Adam Jerzy Bielan NA 5
Adam Markiewicz i Andrzej Otręba NA 1
Adam Ołdakowski i Maria Zbyrowska NA 1
Adam Ołdakowski i Józef Stępkowski NA 31

As stated before

  • member was sometimes described with first and second name (‘Adam Bielan’ vs ‘Adam Jerzy Bielan’)
  • couple of members cosign one interpellation (e.g. ‘Adam Bielan i Zbigniew Ziobro’)
# create dict author + period
un_authors <- all_pi %>% select(AUTHOR, period) %>% unique()
un_authors <- un_authors %>% left_join(y = posl_df, by = c("AUTHOR", "period"))

To clean up that mess I’ll introduce:

  • one manual change
  • assume that first member that signs the interpellation is its author
  • if posel uses second name shorten it to first name and surname
# some manual changes
un_authors$AUTHOR[un_authors$AUTHOR == "łukasz Zbonikowski"] <- "Łukasz Zbonikowski"
# assumption - if multiple poeple sign a interplataion - assign it to the first on the list (most proboalby person responisbile for phrasing)
#   most likely it will be Jan Kowalski i Zbigniew Nowak (so they are separated by small i)
# if posel uses second name - shorten it to first name and surname
un_authors$stripped <- lapply(X = un_authors$AUTHOR, 
                              FUN = function(i){
                                if (i == "na") return(i)
                                gg <- strsplit(i, split = "(\\s|Senator|Poseł|Posel|Poslowie|Z należytym szacunkiem)")[[1]]
                                gg <- trimws(gg)
                                gg <- gg[nchar(gg) > 0]
                                ggs <- regexpr(pattern = "^[[:upper:]]", text = gg) > 0
                                first_zero <- which(!ggs)[1]
                                if (is.na(first_zero)) first_zero <- length(ggs) + 1
                                last_one <- max(which(ggs[1:(first_zero - 1)]))
                                paste0(gg[c(1, last_one)], collapse = " ")
                              }) %>% unlist()
# join it with party dictionairy
un_authors2 <- un_authors %>% 
  left_join(y = posl_df %>% 
              select(stripped = AUTHOR, period, ugr2 = ugr), by = c("stripped", "period")) 

un_authors2$ugr2 <- gsub(pattern = "^(Klub Parlamentarny)|(Koło Parlamentarne)|(Koło Poselskie)|(Klub Poselski)", replacement = "KP", x = un_authors2$ugr2)

# repeat manual changes and join with text data and see if that he
all_pi$AUTHOR[all_pi$AUTHOR == "łukasz Zbonikowski"] <- "Łukasz Zbonikowski"

all_pi %>%
  left_join(un_authors2 %>% select(AUTHOR, period, ugr), by = c("AUTHOR", "period")) %>%
  left_join(un_authors2 %>% select(AUTHOR, stripped, period, ugr2) %>% unique(), by = c("AUTHOR", "period")) %>%
  group_by(period) %>% 
  summarise(count_original = n_distinct(AUTHOR), count_clean = n_distinct(stripped), count_int = n(), 
            perc_without_original = sum(is.na(ugr)) / count_int, perc_without_clean = sum(is.na(ugr2)) / count_int) %>% 
  kable() %>% 
  kable_styling()
period count_original count_clean count_int perc_without_original perc_without_clean
1997-2001 559 339 7444 0.1575766 0.0569586
2001-2005 687 435 10906 0.1444159 0.0790391
2005-2007 685 429 9752 0.2335931 0.0796760

After clean up, instead of 1 in 5 interpellations without an author now I have only 1 in 12 missing.

all_pi <- all_pi %>% 
  left_join(un_authors2 %>% select(AUTHOR, AUTHOR_CLEAN = stripped, period, party = ugr2) %>% unique(), by = c("AUTHOR", "period"))

Clean stemmed data

The data was stem outsied the script - load it

# I've tagged already
pi_tagged_files <- paste0("tagged_", pi_files)
all_pi_tagged <- do.call(rbind, 
                         lapply(X = pi_tagged_files, 
                                FUN = function(i){
                                  mydb <- dbConnect(RSQLite::SQLite(), file.path("data", i))
                                  this_cont <- dbGetQuery(conn = mydb, statement = "select * from tagged")
                                  dbDisconnect(mydb)
                                  this_cont$period <- gsub("tagged_pi_", replacement = "", x = gsub(pattern = ".sqlite", replacement = "", x = i))
                                  this_cont
                                }))

head(all_pi_tagged, 6) %>% 
  kable() %>% 
  kable_styling()
ID ORG TAGGED period
1 Na na 1997-2001
1 początku początek 1997-2001
1 bieżącego bieżący 1997-2001
1 roku rok 1997-2001
1 zwrócił zwrócić 1997-2001
1 em być 1997-2001

The data is stripped from whitespaces and lowercased (unless it is a recognizable name). How many tags (stemmed entities) do I have?

n_distinct(all_pi_tagged$TAGGED)
## [1] 64840

Cleaning:

  • remove words that correspond to dates
  • remove polish stop words
  • remove number (in several formats)
  • remove dates (in several formats)
  • remove words that are most likely in a greeting or in the signature part of interpellation
# cleaning
all_pi_tagged_clean <- all_pi_tagged %>% 
  # remove part with date
  anti_join(y = data.frame(TAGGED = c("dzień", "styczeń", "luty", "marzec", "kwiecień", "maj", "czerwiec", "lipiec", "sierpień", "wrzesień",
                                      "październik", "listopad", "grudzień", "rok")), by = "TAGGED") %>% 
  # remove stopwords
  anti_join(y = polish_stop_words_df("TAGGED"))

# remove numbers
all_pi_tagged_clean <- all_pi_tagged_clean[regexpr(pattern = "^\\d+$", text = all_pi_tagged_clean$TAGGED) < 0, ]

# %, +
all_pi_tagged_clean <- all_pi_tagged_clean[regexpr(pattern = "^\\W$", text = all_pi_tagged_clean$TAGGED) < 0, ]

# numbers with comma as decimal point
all_pi_tagged_clean <- all_pi_tagged_clean[regexpr(pattern = "^\\d+,\\d+$", text = all_pi_tagged_clean$TAGGED) < 0, ]

# numbers with dot as decimal point
all_pi_tagged_clean <- all_pi_tagged_clean[regexpr(pattern = "^\\d+\\.\\d+$", text = all_pi_tagged_clean$TAGGED) < 0, ]

# remove dates xx.xx.xxxx
all_pi_tagged_clean <- all_pi_tagged_clean[regexpr(pattern = "^\\d{1,2}\\.(0\\d{1}|\\d{1,2})\\.(\\d{2}|\\d{4})$", text = all_pi_tagged_clean$TAGGED) < 0, ]

# remove dates xx-xx-xxxx
all_pi_tagged_clean <- all_pi_tagged_clean[regexpr(pattern = "^\\d{1,2}-(0\\d{1}|\\d{1,2})-(\\d{2}|\\d{4})$", text = all_pi_tagged_clean$TAGGED) < 0, ]

# remove words like 'szanowny', 'minister', 'premier' because they come from a greeting at the beginnig of the interpellation or at the end ("poseł", "poważanie")
all_pi_tagged_clean <- all_pi_tagged_clean %>% filter(!TAGGED %in% c("szanowny", "minister", "premier", "poseł", "poważanie"))

How many tags are in the end?

un_tagged <- sort(unique(all_pi_tagged_clean$TAGGED))
length(un_tagged)
## [1] 56516

In order to incorporate Text Mining algorithms I’ll create documents from processed stemmed data.

all_pi_tagged <- all_pi_tagged_clean %>% 
  group_by(period, ID) %>% 
  summarise(CONTENT = paste0(TAGGED, collapse = " "))

head(all_pi_tagged, 2) %>% 
  kable() %>% 
  kable_styling()
period ID CONTENT
1997-2001 1 początek bieżący zwrócić zdrowie sprawa przestrzegać przepis ustawa dotyczyć dopuszczalność przerywać ciąża wskazać niektóry województwo województwo kielecki obowiązywać ustawa kobieta chcieć skorzystać przysługiwać prawo mieć możliwość wynikać fakt ginekolog publiczny placówka opieka zdrowotny gremialnie odmawiać wykonać dopuszczalny prawnie zabieg spełnić zainteresowany kobieta przewidzieć przepis wymóg zaznaczyć przepis dawać określić prawo kobieta mieć obowiązek uprawnienie gwarantować odpowiedź zdrowie zobowiązać podjąć działanie zmierzać województwo kielecki doprowadzić prawidłowy funkcjonować ustawa zgodzić chyba móc województwo mieć placówka kobieta móc liczyć prawo uszanować niezrozumiały chóralny powoływać ginekolog kodeks etyka lekarski często ginekolog wykonywać zabieg aborcja prywatnie zacisze własny gabinet oczywiście odpowiedni opłata oceniać szczyt hipokryzja pomijać kodeks zawodowy móc sytuować obowiązujący prawo podstawowy problem brzmieć kwestia przysługiwać kobieta prawo rozwiązać zgodnie przepis ustawa dotąd nikt przepis zmienić wydać wejście życie nowy konstytucja orzeczenie trybunał konstytucyjny mieć moc stanowić mieć sytuacja obowiązujący prawo przypadek prawo papier chcieć spytać zatem raz działanie resort zdrowie podjąć podjąć przysługiwać kobieta prawo przestrzegać wreszcie sprawa zostać rozwiązać gwarantować kobieta minimum godność prosić konkretny informacja efekt dotychczasowy działanie podjąć województwo kielecki ostatni czas zgłaszać biuro poselski kobieta wskazywać prywatnie pieniądz zabieg móc mieć wykonać jednocześnie lekarz wojewódzki stan wskazać placówka móc mieć wykonać zabieg darmo uważać sytuacja wyjątkowo bulwersujący Władysław Adamski Warszawa
1997-2001 2 trwać protest anestezjolog przeciwny polityka rząd RP dyskryminować lekarz okręg gliwicki głodować anestezjolog szpital główny postulat wyposażyć szpital sprzęt anestezjologiczny często stan użyć zagrażać życie zdrowie pacjent wzrost wynagrodzenie lekarz anestezjolog maksymalny stawka dany grupa zaszeregowanie plus premia kwota niski średni krajowy lekarz wojewódzki A Sośnierz rozmowa głodować lekarz wygospodarować pieniądz rozesłać dyrektor szpital niestety podwyżka rezultat rząd złoty zdrowie lekarz podległy pacjent zagrozić sprawa oczywisty wymagać natychmiastowy realizacja zwracać Jan Olszewski Warszawa

Basic information

Basic information regarding data

all_pi %>% group_by(period) %>% 
  summarise(count = n(), autohrs = n_distinct(AUTHOR_CLEAN), av_len = mean(len), sd_len = sd(len), min_len = min(len), max_len = max(len)) %>% 
  kable() %>% 
  kable_styling()
period count autohrs av_len sd_len min_len max_len
1997-2001 7444 339 2002.257 1371.682 260 20858
2001-2005 10906 435 2377.523 2084.135 65 53942
2005-2007 9724 429 2274.355 1594.731 82 20618

For each period there is between 7.4k and 10.9k documents of average length of 2k characters. See how the interpolation number by date changed.

all_pi %>% 
  group_by(date) %>% 
  summarise(count = n()) %>% 
  ggplot(aes(x = date, y = count)) +
  geom_col() + 
  geom_smooth() +
  theme_minimal()

One can clearly see that the number of interpollation increases in time with some seasonal variations. Lets interpollation number by period but counting from the start of the term.

all_pi %>% 
  left_join(y = period_bands, by = "period") %>% 
  mutate(days_by = as.numeric(date - start_date)) %>% 
  group_by(days_by, period) %>% 
  summarise(count = n()) %>% 
  ggplot(aes(x = days_by, y = count, group = period)) +
  geom_point(alpha = .1) + 
  geom_smooth() + 
  facet_wrap(~period, scales = "free") +
  theme_minimal()

Which words appear the most (most mentions in a single day)?

summ_data <- all_pi_tagged_clean %>% 
  left_join(y = all_pi %>% select(ID, period, date)) %>% 
  group_by(TAGGED, date) %>% 
  summarise(count = n(), n_ids = n_distinct(ID)) %>% 
  ungroup() %>% 
  arrange(TAGGED, date)

summ_data %>% 
  group_by(TAGGED) %>% 
  summarise(count_mx = max(count)) %>% 
  top_n(n = 10, wt = count_mx) %>% 
  kable() %>% 
  kable_styling()
TAGGED count_mx
FSO 216
SA 111
artykuł 139
daewoo 324
działalność 112
komisaryczny 162
odpad 175
spółka 137
ustawa 136
zarząd 198

Network analysis

Since dataset is vast the analysis will be conducted on 3 terms separately and results will be compared. Also interpellations of people who I could not assign to a specific political party will be removed.

to_analyze_net <- lapply(X = period_bands$period, 
                         FUN = function(x) all_pi_tagged %>% 
                           filter(period == x) %>% 
                           left_join(y = all_pi %>% select(ID, period, AUTHOR = AUTHOR_CLEAN, party), by = c("ID", "period")) %>% 
                           filter(!is.na(party)))
names(to_analyze_net) <- period_bands$period

Create texnets::PrepText objects

prepped_tagged <- lapply(X = period_bands$period, 
                         FUN = function(x){
                           textnets::PrepText(textdata = to_analyze_net[[x]],
                                              groupvar = "AUTHOR",
                                              textvar = "CONTENT",
                                              node_type = "groups",
                                              tokenizer = "words",
                                              pos = "nouns",
                                              # since I've done it already
                                              remove_stop_words = FALSE, 
                                               # since I've stemmed externally
                                              compound_nouns = FALSE)
                         })
names(prepped_tagged) <- period_bands$period

Create network objects and convert them to igraph representation

pi_networks <- lapply(X = period_bands$period, FUN = function(x) textnets::CreateTextnet(tidytextobject = prepped_tagged[[x]]))
names(pi_networks) <- period_bands$period

converted_graphs <- lapply(X = period_bands$period, 
                           FUN = function(x) 
                             convert_to_igraph(text_network_graph = pi_networks[[x]], 
                                               edge_df = to_analyze_net[[x]] %>% 
                                                 group_by(AUTHOR) %>% 
                                                 summarise(k = n()) %>% 
                                                 left_join(y = posl_df %>% filter(period == x))))

names(converted_graphs) <- period_bands$period

Network graphs

Each tab consists of a graph that represent a network for each period:

  • color of vertices is based on the member’s party
  • size on member’s number of interpollations in each period
  • size of edge is based on the weight between two vertices.

The sizes of egdes/vertices are scaled to the data from each period so we cannot compare between periods.

1997-2001

plot_graph(converted_graphs[[1]], idx_show_label = V(converted_graphs[[1]])$ip > quantile(V(converted_graphs[[1]])$ip, .9))

2001-2005

plot_graph(converted_graphs[[2]], idx_show_label = V(converted_graphs[[1]])$ip > quantile(V(converted_graphs[[2]])$ip, .9))

2005-2007

plot_graph(converted_graphs[[3]], idx_show_label = V(converted_graphs[[1]])$ip > quantile(V(converted_graphs[[3]])$ip, .9))

It is hard to see any patterns in any of those periods. Mean degree in each period was close to 3 but there were some members that connected to more than 150 members (table below).

graphs_degrees <- do.call(rbind, 
                          lapply(X = period_bands$period, 
                                 FUN = function(x){
                                   cbind(data.frame(period = x), 
                                         enframe(degree(converted_graphs[[x]])))
                                 }))
graphs_degrees %>% 
  group_by(period) %>% 
  summarise(mean(value), max(value)) %>% 
  left_join(y = graphs_degrees %>% group_by(period) %>% top_n(n = 1, wt = value)) %>% 
  kable() %>% 
  kable_styling()
period mean(value) max(value) name value
1997-2001 2.980769 156 Zygmunt Żymełka 156
2001-2005 2.981432 188 Zyta Gilowska 188
2005-2007 2.989691 192 Zygmunt Wrzodak 192

What are the top connections (edges)?

do.call(rbind, 
        lapply(X = period_bands$period, 
               FUN = function(x) {
                 mx_w <- get_edge_top_weights(converted_graphs[[x]])
                 mx_w <- mx_w %>% 
                   left_join(y = un_authors2 %>% filter(period == x) %>% select(V1 = AUTHOR, ugr1 = ugr2) %>% unique(), by = "V1") %>% 
                   left_join(y = un_authors2 %>% filter(period == x) %>% select(V2 = AUTHOR, ugr2 = ugr2) %>% unique(), by = "V2") %>% 
                   select(member1 = V1, party1 = ugr1, member2 = V2, party2 = ugr2, weight = w)
                 cbind(data.frame(period = x), mx_w)
               })) %>% 
  kable() %>% 
  kable_styling()
period member1 party1 member2 party2 weight
1997-2001 Zbigniew Szymański KP Akcji Wyborczej Solidarność Zbigniew Wawak KP Akcji Wyborczej Solidarność 0.0653516
1997-2001 Zdzisław Denysiuk KP Akcji Wyborczej Solidarność Zdzisław Kałamaga KP Sojuszu Lewicy Demokratycznej 0.0646151
1997-2001 Zygmunt Machnik KP Sojuszu Lewicy Demokratycznej Zygmunt Ratman KP Sojuszu Lewicy Demokratycznej 0.0681055
2001-2005 Witold Hatka KP Liga Polskich Rodzin Władysław Rak KP Sojuszu Lewicy Demokratycznej 0.0483525
2001-2005 Wojciech Olejniczak KP Sojuszu Lewicy Demokratycznej Wojciech Szarama KP Prawo i Sprawiedliwość 0.0488338
2001-2005 Zygmunt Wrzodak KP Liga Polskich Rodzin Zyta Gilowska KP Platforma Obywatelska 0.0490947
2005-2007 Stanisław Zając KP Prawo i Sprawiedliwość Stanisław Żelichowski KP Polskiego Stronnictwa Ludowego 0.0626255
2005-2007 Zbigniew Dolata KP Prawo i Sprawiedliwość Zbigniew Girzyński KP Prawo i Sprawiedliwość 0.0485816
2005-2007 Zofia Grabczan KP Samoobrona Rzeczypospolitej Polskiej Zygmunt Wrzodak Posłowie niezrzeszeni 0.0463515

As we see the top connections mostly between members of the same party, but not always (e.g. Zbyszek Zaborowski from KP Sojuszu Lewicy Demokratycznej and Zdzisław Denysiuk from KP Akcji Wyborczej Solidarność in 1997-2001 term).

Let see if weight depends whether members come from the same party.

do.call(rbind, 
        lapply(X = period_bands$period, 
               FUN = function(x) {
                 mx_w <- get_edge_top_weights(converted_graphs[[x]], n_n = Inf)
                 mx_w <- mx_w %>% 
                   left_join(y = un_authors2 %>% filter(period == x) %>% select(V1 = stripped, ugr1 = ugr2) %>% unique(), by = "V1") %>% 
                   left_join(y = un_authors2 %>% filter(period == x) %>% select(V2 = stripped, ugr2 = ugr2) %>% unique(), by = "V2") %>% 
                   mutate(diff_party = 1 * (ugr2 != ugr1)) %>% 
                   group_by(diff_party) %>% 
                   summarise(mw = mean(w), sdw = sd(w), count = n())
                 cbind(data.frame(period = x), mx_w)
               })) %>% 
  pivot_wider(values_fill = 0, id_cols = "period", values_from = c("mw", "sdw", "count"), names_from = "diff_party") %>% 
  kable() %>% 
  kable_styling()
period mw_0 mw_1 sdw_0 sdw_1 count_0 count_1
1997-2001 0.0253298 0.0199200 0.0218089 0.0202883 81 384
2001-2005 0.0159565 0.0159696 0.0158799 0.0158661 74 488
2005-2007 0.0218432 0.0132100 0.0132317 0.0145419 98 482

So the majority of edges are for different party members (count_1 higher than count_2) but the connection (edge) is stronger (higher weight) when both members are from the same party(mw_0 is greater than mw_1).

Interestingly in the term of 2001-2005 mean weight of the edge between same party members was similar to the mean weight of the edge between different party members.

Communities

Another thing to look at analysing text network is to analyse communties

pi_communities <- lapply(X = period_bands$period, FUN = function(x) textnets::TextCommunities(pi_networks[[x]]))
names(pi_communities) <- period_bands$period
do.call(rbind, 
        lapply(X = period_bands$period,
               FUN = function(x){
                 res <- pi_communities[[x]] %>% 
                   group_by(modularity_class) %>% 
                   summarise(n_m = n()) %>% 
                   ungroup() %>% 
                   summarise(n_groups = n(), min_mem = min(n_m), max_mem = max(n_m))
                 cbind(data.frame(period = x), res)
               })) %>% 
  kable() %>% 
  kable_styling()
period n_groups min_mem max_mem
1997-2001 8 6 95
2001-2005 6 27 81
2005-2007 8 11 102

Detailed picture of communities is provided in tabs below. In each period there were 7-8 communities that consists from as little as 14 to as much as 112 members.

1997-2001

pi_communities[[1]] %>% 
  group_by(modularity_class) %>% 
  summarise(no_members = n(), members = paste0(group, collapse = "; ")) %>% 
  kable() %>% 
  kable_styling()
modularity_class no_members members
1 48 Adam Biela; Cezary Stryjak; Elżbieta Barys; Grzegorz Kurczuk; Henryk Wujec; Jacek Szczot; Jan Byra; Jan Jackowski; Jan Łopuszański; Janusz Dobrosz; Jarosław Kaczyński; Jarosław Kalinowski; Jerzy Barzowski; Joanna Fabisiak; Kazimierz Dzielski; Krystyna Łybacka; Krzysztof Kamiński; Lesław Podkański; Maciej Jankowski; Maciej Manicki; Marek Biernacki; Marek Kaczyński; Mariusz Kamiński; Michał Janiszewski; Mieczysław Szczygieł; Piotr Gadzinowski; Seweryn Kaczmarek; Stanisław Janas; Stanisław Kalemba; Stanisław Misztal; Stanisław Stec; Stanisław Wądołowski; Szymon Niemiec; Tadeusz Cymański; Tadeusz Tomaszewski; Teresa Liszcz; Tomasz Karwowski; Wiesław Kaczmarek; Witold Firak; Wojciech Hausner; Wojciech Nowaczyk; Wojciech Włodarczyk; Wojciech Zarzycki; Zbigniew Janas; Zbigniew Szymański; Zdzisław Podkański; Zdzisław Pupa; Zdzisław Tuszyński
2 95 Adam Bielan; Aleksander Bentkowski; Andrzej Brachmański; Andrzej Folwarczny; Andrzej Pęczak; Andrzej Słomski; Andrzej Smoliński; Andrzej Szkaradek; Andrzej Umiński; Andrzej Zapałowski; Anna Bańkowska; Anna Zalewska; Bronisława Kowalska; Czesław Ryszka; Danuta Ciborowska; Danuta Grabowska; Elżbieta Radziszewska; Elżbieta Szparaga; Ewa Janik; Ewa Tomaszewska; Franciszek Potulski; Franciszek Stefaniuk; Grzegorz Piechowiak; Helmut Paździor; Henryk Długosz; Henryk Kroll; Izabella Sierakowska; Jan Chmielewski; Jan Kochanowski; Jan Król; Jan Kulas; Jan Lityński; Jan Sieńko; Jan Syczewski; Jan Zaciura; Jerzy Budnik; Jerzy Czepułkowski; Jerzy Jaskiernia; Jerzy Szmajdziński; Joanna Sosnowska; Józef Bergier; Kazimierz Działocha; Kazimierz Kapera; Kazimierz Marcinkiewicz; Kazimierz Sas; Kazimierz Szczygielski; Kazimierz Ujazdowski; Krzysztof Anuszkiewicz; Krzysztof Baszczyński; Krzysztof Janik; Krzysztof Jurgiel; Krzysztof Kłak; Lech Nikolski; Longin Pastusiak; Marcin Zawiła; Marek Olewiński; Marian Blecharczyk; Marian Dembiński; Michał Kaczmarek; Mieczysław Czerniawski; Mieczysław Jacków; Mirosław Czech; Mirosław Koźlakiewicz; Mirosław Kukliński; Regina Pawłowska; Roman Rutkowski; Roman Sroczyński; Ryszard Brejza; Ryszard Hayn; Ryszard Matusiak; Ryszard Stanibuła; Ryszard Ulicki; Sergiusz Plewa; Stanisław Kopeć; Stanisław Pawlak; Stanisław Szwed; Stanisław Zając; Stanisław Żelichowski; Sylwia Pusz; Tadeusz Jarmuziewicz; Teresa Jasztal; Urszula Wachowska; Waldemar Pawłowski; Wiesław Walendziak; Witold Deręgowski; Władysław Kielian; Władysław Skrzypek; Władysław Szkop; Włodzimierz Wasiński; Zbigniew Rynasiewicz; Zbigniew Senkowski; Zbigniew Wawak; Zbyszek Zaborowski; Zdzisława Kobylińska; Zofia Wilczyńska
3 58 Adam Szejnfeld; Andrzej Gargaś; Andrzej Skorulski; Anna Sobecka; Antoni Szymański; Barbara Blida; Bernard Szweda; Bogdan Lewandowski; Dariusz Kubiak; Edward Maniura; Edward Wende; Eugeniusz Kłopotek; Grzegorz Gruszka; Grzegorz Schetyna; Grzegorz Woźny; Helena Góralska; Henryk Goryszewski; Ireneusz Niewiarowski; Jan Chojnacki; Jan Wyrowiński; Janusz Brzeski; Janusz Zemke; Jerzy Madej; Jerzy Polaczek; Jerzy Wierchowicz; Jerzy Zakrzewski; Józef Gruszka; Józef Lassota; Karol Działoszyński; Karol Łużniak; Maciej Rudnicki; Marek Lewandowski; Marek Sawicki; Marek Wikiński; Marek Zieliński; Marian Marczewski; Mieczysław Jedoń; Paweł Arndt; Paweł Piskorski; Piotr Lewandowski; Piotr Miszczuk; Renata Szynalska; Romuald Ajchler; Ryszard Wawryniewicz; Stanisław Pilniakowski; Stefan Macner; Tadeusz Biliński; Tadeusz Syryjczyk; Wiesław Ciesielski; Wiesław Kiełbowicz; Wiesław Szczepański; Witold Nieduszyński; Władysław Frasyniuk; Władysław Rak; Zbigniew Janowski; Zbigniew Siemiątkowski; Zbigniew Zarębski; Zdzisław Denysiuk
4 19 Adam Wędrychowicz; Andrzej Brzeski; Grzegorz Cygonik; Henryk Dykty; Irena Nowacka; Jan Rokita; Jan Szymański; Józef Nowicki; Kazimierz Nycz; Lech Szymańczyk; Marek Markiewicz; Mariusz Grabowski; Mirosław Swoszowski; Ryszard Ostrowski; Tadeusz Lewandowski; Wacław Olak; Waldemar Sikora; Wiesław Woda; Zenon Kufel
5 35 Agnieszka Pasternak; Alfred Owoc; Andrzej Kozioł; Andrzej Otręba; Andrzej Żelazowski; Anna Filek; Barbara Frączek; Barbara Imiołczyk; Bogdan Pęk; Jacek Kasprzyk; Jan Olszewski; Jerzy Godzik; Jerzy Wenderlich; Jolanta Banach; Józef Górny; Józef Oleksy; Katarzyna Piekarska; Kazimierz Chrzanowski; Kosma Złotowski; Krystyna Herman; Ludwik Dorn; Marek Mazurkiewicz; Maria Smereczyńska; Paweł Bryłowski; Piotr Żak; Seweryn Jurgielaniec; Tadeusz Iwiński; Tadeusz Mazowiecki; Tadeusz Pawlus; Tadeusz Zieliński; Witold Tomczak; Władysław Adamski; Władysław Bułka; Włodzimierz Puzyna; Zbigniew Sobotka
6 35 Andrzej Osnowski; Andrzej Szarawarski; Andrzej Zając; Czesław Fiedorowicz; Czesław Pogoda; Czesław Śleziak; Edward Daszkiewicz; Grzegorz Walendzik; Jan Oraniec; Jan Rejczak; Janina Kraus; Jerzy Jankowski; Jerzy Zając; Józef Błaszczyk; Józef Korpak; Kazimierz Poznański; Krystyna Cencek; Krzysztof Śmieja; Marek Dyduch; Marek Wójcik; Maria Stolzman; Marian Juśko; Mirosław Pawlak; Mirosław Podsiadło; Paweł Nowok; Piotr Ikonowicz; Stanisław Iwanicki; Stanisław Kracik; Tadeusz Wrona; Władysław Stępień; Wojciech Frank; Zdzisław Kałamaga; Zygmunt Machnik; Zygmunt Ratman; Zygmunt Żymełka
7 16 Bogumił Borowski; Bogusław Liberadzki; Ewa Freyberg; Jacek Piechota; Jerzy Gwiżdż; Józef Mozolewski; Kazimierz Barczyk; Krzysztof Oksiuta; Leszek Szewc; Marian Cycoń; Mariusz Ambroziak; Michał Kamiński; Radosław Gawlik; Ryszard Zbrzyzny; Tadeusz Maćkała; Wacław Martyniuk
8 6 Bronisław Dankowski; Jan Klimek; Józef Pilarczyk; Stanisław Brzózka; Szczepan Skomra; Wiktor Osik

2001-2005

pi_communities[[2]] %>% 
  group_by(modularity_class) %>% 
  summarise(no_members = n(), members = paste0(group, collapse = "; ")) %>% 
  kable() %>% 
  kable_styling()
modularity_class no_members members
1 31 Adam Lipiński; Andrzej Gałażewski; Bolesław Piecha; Bożena Kozłowska; Czesław Cieślak; Eugeniusz Wycisło; Franciszek Franczak; Franciszek Potulski; Franciszek Stefaniuk; Franciszek Wołowicz; Gabriel Janowski; Gabriela Masłowska; Ireneusz Niewiarowski; Jan Antochowski; Jan Rzymełka; Józef Mioduszewski; Józef Nowicki; Józef Szczepańczyk; Krzysztof Filipek; Marian Marczewski; Marian Piłka; Mariusz Kamiński; Michał Figlus; Ryszard Pojda; Sebastian Florek; Tadeusz Motowidło; Tadeusz Samborski; Tomasz Tomczykiewicz; Władysław Stępień; Włodzimierz Czechowski; Zbyszek Zaborowski
2 80 Adam Markiewicz; Adam Szejnfeld; Aldona Michalak; Andrzej Aumiller; Andrzej Brachmański; Andrzej Otręba; Andrzej Zając; Barbara Blida; Barbara Marianowska; Bogdan Błaszczyk; Bogdan Zdrojewski; Cezary Grabarczyk; Cezary Stryjak; Czesław Pogoda; Edmund Borawski; Ewa Janik; Grzegorz Gruszka; Grzegorz Woźny; Jacek Falfus; Jacek Kasprzyk; Jan Klimek; Jan Knapik; Jan Kochanowski; Jan Kubik; Jan Łączny; Jan Szwarc; Janusz Krasoń; Janusz Lisak; Janusz Piechociński; Jarosław Duda; Jerzy Budnik; Jerzy Pękała; Joanna Senyszyn; Józef Cepil; Józef Głowa; Józef Gruszka; Józef Kubica; Józef Tomala; Kazimierz Chrzanowski; Kazimierz Pietrzyk; Kazimierz Sas; Krystyna Herman; Leszek Samborski; Leszek Świętochowski; Marcin Wnuk; Marek Sawicki; Marek Wikiński; Marek Żyliński; Marian Kawa; Marian Stępień; Michał Stuligrosz; Mieczysław Jedoń; Olgierd Poniźnik; Robert Luśnia; Roman Jagieliński; Romuald Ajchler; Ryszard Nowak; Ryszard Zbrzyzny; Stanisław Gorczyca; Stanisław Jarmoliński; Stanisław Piosik; Stanisław Rydzoń; Stanisław Stec; Stanisław Szyszkowski; Stanisław Żmijan; Tadeusz Kaleniecki; Tadeusz Maćkała; Tadeusz Myler; Waldemar Borczyk; Waldemar Pawlak; Waldy Dzikowski; Władysław Rak; Wojciech Długoborski; Wojciech Domaradzki; Zbigniew Janowski; Zbigniew Krutczenko; Zbigniew Musiał; Zbigniew Podraza; Zdzisław Kałamaga; Zyta Gilowska
3 81 Adam Ołdakowski; Adam Woś; Aleksander Czuż; Aleksander Grad; Alfred Budner; Alfred Owoc; Alicja Lis; Andrzej Fedorowicz; Andrzej Grzesik; Andrzej Grzyb; Andrzej Mańka; Andrzej Umiński; Arkadiusz Bratkowski; Arkadiusz Kasznia; Barbara Ciruk; Benedykt Suchecki; Bogusław Wontor; Bolesław Bujak; Bronisław Dankowski; Czesław Marzec; Czesław Śleziak; Eugeniusz Czykwin; Eugeniusz Kłopotek; Genowefa Wiśniowska; Grzegorz Górniak; Grzegorz Kurczuk; Halina Murias; Helmut Paździor; Henryk Ostrowski; Irena Nowacka; Izabella Sierakowska; Jan Byra; Jan Orkisz; Jan Tomaka; Jan Zaworski; Jarosław Zieliński; Jerzy Jaskiernia; Józef Laskowski; Józef Skutecki; Katarzyna Piekarska; Krystian Łuczak; Lech Kuropatwiński; Marek Muszyński; Marek Zagórski; Maria Dziuba; Maria Wiśniowiecka; Maria Zbyrowska; Marian Curyło; Marian Kwiatkowski; Marian Wesołowski; Mieczysław Aszkiełowicz; Mieczysław Czerniawski; Mieczysław Kasprzak; Renata Beger; Roman Giertych; Ryszard Stanibuła; Stanisław Dulias; Stanisław Janas; Stanisław Kalemba; Stanisław Kopeć; Stanisław Żelichowski; Szczepan Skomra; Szymon Giżyński; Tadeusz Badach; Tadeusz Balcerowski; Tadeusz Cymański; Tadeusz Gajda; Tadeusz Iwiński; Tadeusz Polański; Tadeusz Szukała; Tadeusz Tomaszewski; Tadeusz Urban; Tadeusz Wojtkowiak; Wacław Klukowski; Wiesław Woda; Wiktor Osik; Wojciech Borzuchowski; Wojciech Olejniczak; Wojciech Zarzycki; Zbigniew Deptuła; Zbigniew Siemiątkowski
4 27 Adam Sosnowski; Agnieszka Pasternak; Aleksander Szczygło; Aleksandra Jakubowska; Antoni Macierewicz; Bogdan Bujak; Ewa Kantor; Grzegorz Dolniak; Hanna Gucwińska; Jan Rokita; Jan Sztwiertnia; Jerzy Młynarczyk; Jerzy Szteliga; Krystyna Łybacka; Krzysztof Zaremba; Lech Zielonka; Leszek Korzeniowski; Marek Borowski; Mariusz Grabowski; Michał Turkiewicz; Renata Basta; Ryszard Maraszek; Sławomir Nowak; Stanisław Gudzowski; Stanisława Prządka; Wiesław Jędrusik; Wojciech Jasiński
5 81 Aleksandra Gramała; Andrzej Jagiełło; Andrzej Liss; Andrzej Namysło; Andrzej Wojtyła; Anna Bańkowska; Anna Filek; Anna Sobecka; Antoni Mężydło; Antoni Stryjewski; Bartłomiej Szrajber; Bogusława Towalewska; Bronisław Dutka; Bronisława Kowalska; Danuta Ciborowska; Danuta Polak; Dorota Kwaśniewska; Edward Maniura; Edward Płonka; Edward Wojtalik; Elżbieta Bolek; Elżbieta Jankowska; Elżbieta Łukacijewska; Elżbieta Radziszewska; Elżbieta Romero; Elżbieta Szparaga; Ewa Sowińska; Grażyna Ciemniak; Grażyna Paturalska; Grażyna Pijanowska; Grzegorz Napieralski; Grzegorz Schetyna; Hanna Mierzejewska; Jacek Kowalik; Jacek Sauk; Jan Sieńko; Jan Szymański; Jarosław Kalinowski; Jerzy Müller; Joanna Nowiak; Joanna Sosnowska; Jolanta Banach; Jolanta Szczypińska; Józef Fortuna; Józef Oleksy; Józef Pilarczyk; Kazimierz Marcinkiewicz; Kazimierz Plocke; Krystyna Szumilas; Krzysztof Baszczyński; Krzysztof Rutkowski; Leszek Zieliński; Magdalena Banaś; Małgorzata Rohde; Małgorzata Stryjska; Marek Kuchciński; Maria Nowak; Marian Janicki; Mariola Sokołowska; Mariusz Łapiński; Mirosław Krajewski; Mirosław Pawlak; Mirosława Kątna; Piotr Kozłowski; Renata Szynalska; Robert Smoleń; Ryszard Tomczyk; Sławomir Rybicki; Stanisław Kalinowski; Sylwia Pusz; Tadeusz Kędziak; Tadeusz Parchański; Teresa Jasztal; Teresa Piotrowska; Tomasz Mamiński; Tomasz Szczypiński; Witold Hatka; Wojciech Szarama; Zbigniew Chlebowski; Zbigniew Sosnowski; Zofia Wilczyńska
6 77 Alicja Olechowska; Andrzej Czerwiński; Andrzej Lepper; Andrzej Markowiak; Andrzej Pęczak; Andrzej Różański; Artur Zawisza; Bogdan Lewandowski; Bohdan Kopczyński; Bożena Kizińska; Bronisław Komorowski; Danuta Grabowska; Danuta Hojarska; Dariusz Bachalski; Elżbieta Kruk; Ewa Kopacz; Ewa Kralkowska; Gertruda Szumska; Grzegorz Tuderek; Halina Szustak; Jacek Wojciechowicz; Jacek Zdrojewski; Jan Bury; Jan Chojnacki; Jan Łopuszański; Janusz Dobrosz; Jerzy Czerwiński; Jerzy Michalski; Jerzy Polaczek; Jerzy Wenderlich; Józef Krzyworzeka; Józef Skowyra; Kazimierz Ujazdowski; Kazimierz Wójcik; Konstanty Miodowicz; Krystyna Grabicka; Krystyna Ozga; Krystyna Skowrońska; Krzysztof Oksiuta; Leszek Murzyn; Leszek Sułek; Ludwik Dorn; Łukasz Abgarowicz; Maciej Płażyński; Marek Jurek; Marek Kotlinowski; Marek Suski; Marian Widz; Paweł Graś; Paweł Poncyljusz; Piotr Gadzinowski; Piotr Krzywicki; Piotr Smolana; Przemysław Gosiewski; Renata Rochnowska; Robert Strąk; Ryszard Hayn; Ryszard Kalisz; Ryszard Kędra; Stanisław Łyżwiński; Stanisław Papież; Stanisław Zadora; Tadeusz Jarmuziewicz; Tomasz Markowski; Wanda Łyżwińska; Wiesław Kaczmarek; Wiesław Okoński; Wojciech Mojzesowicz; Zbigniew Dziewulski; Zbigniew Nowak; Zbigniew Wassermann; Zbigniew Witaszek; Zbigniew Ziobro; Zdzisław Jankowski; Zenon Tyma; Zygmunt Szymański; Zygmunt Wrzodak

2005-2007

pi_communities[[3]] %>% 
  group_by(modularity_class) %>% 
  summarise(no_members = n(), members = paste0(group, collapse = "; ")) %>% 
  kable() %>% 
  kable_styling()
modularity_class no_members members
1 102 Adam Hofman; Adam Ołdakowski; Adam Rogacki; Aldona Młyńczak; Aleksander Chłopek; Andrzej Dera; Andrzej Gałażewski; Antoni Mężydło; Arkadiusz Rybicki; Arnold Masin; Artur Górski; Bartłomiej Szrajber; Beata Bublewicz; Beata Sawicka; Beata Szydło; Czesław Hoc; Czesław Mroczek; Daniel Pawłowiec; Daniela Chrapkiewicz; Danuta Pietraszewska; Dariusz Lipiński; Elżbieta Pierzchała; Elżbieta Ratajczak; Elżbieta Wiśniowska; Ewa Kopacz; Ewa Więckowska; Ewa Wolak; Halina Molka; Hubert Costa; Jacek Tomczak; Jadwiga Wiśniewska; Jadwiga Zakrzewska; Jan Bednarek; Jan Libicki; Jan Ołdakowski; Jan Rzymełka; Janusz Wójcik; Jarosław Duda; Jerzy Fedorowicz; Jerzy Kozdroń; Jerzy Zawisza; Joanna Fabisiak; Józef Stępkowski; Kazimierz Chrzanowski; Kazimierz Gołojuch; Kazimierz Gwiazdowski; Kazimierz Matuszny; Krystyna Łybacka; Krystyna Szumilas; Krzysztof Lisek; Krzysztof Sikora; Krzysztof Szyga; Leszek Korzeniowski; Lucyna Wiśniewska; Maciej Świątkowski; Małgorzata Olejnik; Małgorzata Sadurska; Małgorzata Stryjska; Marek Kawa; Marek Matuszewski; Marek Polak; Maria Nowak; Marian Piłka; Michał Jach; Michał Stuligrosz; Monika Ryniak; Paweł Arndt; Paweł Poncyljusz; Paweł Śpiewak; Przemysław Andrejuk; Radosław Parda; Rafał Muchacki; Renata Rochnowska; Robert Pantera; Roman Kosecki; Ryszard Knosala; Sławomir Piechota; Stanisław Zadora; Tadeusz Aziewicz; Tadeusz Cymański; Tadeusz Iwiński; Tadeusz Jarmuziewicz; Tadeusz Kopeć; Tadeusz Motowidło; Tadeusz Wita; Teresa Piotrowska; Tomasz Dudziński; Tomasz Garbowski; Tomasz Górski; Tomasz Kulesza; Tomasz Latos; Tomasz Nowak; Tomasz Szczypiński; Waldemar Andzel; Waldemar Szadny; Waldy Dzikowski; Wiesław Kilian; Wojciech Ziemniak; Zbigniew Chmielowiec; Zbigniew Dolata; Zbigniew Pacelt; Zbigniew Włodkowski
2 68 Adam Szejnfeld; Alicja Olechowska; Alojzy Lysko; Andrzej Adamczyk; Andrzej Czerwiński; Andrzej Grzesik; Andrzej Lepper; Andrzej Markowiak; Andrzej Ruciński; Andrzej Szlachta; Anna Paluch; Artur Ostrowski; Artur Zawisza; Barbara Marianowska; Beata Kempa; Bolesław Piecha; Czesław Litwin; Dariusz Olszewski; Edmund Borawski; Edward Ośko; Elżbieta Witek; Eugeniusz Wycisło; Ewa Janik; Ewa Malik; Gabriela Masłowska; Grzegorz Janik; Grzegorz Schetyna; Grzegorz Tobiszowski; Henryk Milcarz; Izabela Kloc; Jacek Falfus; Jacek Kościelniak; Jan Łączny; Janusz Chwierut; Janusz Dobrosz; Janusz Maksymiuk; Jerzy Budnik; Józef Berger; Krzysztof Filipek; Krzysztof Gadowski; Krzysztof Grzegorek; Krzysztof Lipiec; Krzysztof Mikuła; Krzysztof Tchórzewski; Leszek Sułek; Lidia Staroń; Lucjan Karasiewicz; Maks Kraczkowski; Marek Ast; Marek Surmacz; Marzena Paduch; Michał Wójcik; Michał Wojtkiewicz; Paweł Graś; Paweł Olszewski; Rafał Grupiński; Ryszard Wawryniewicz; Ryszard Zbrzyzny; Sebastian Karpiniuk; Stanisław Żmijan; Tomasz Głogowski; Tomasz Markowski; Urszula Augustyn; Wacław Martyniuk; Wanda Łyżwińska; Wiesław Szczepański; Wojciech Saługa; Zygmunt Wrzodak
3 82 Aleksander Grad; Aleksander Sopliński; Alfred Budner; Alina Gut; Andrzej Ćwierz; Andrzej Grzyb; Andrzej Mańka; Andrzej Pałys; Beata Mazurek; Bernard Ptak; Bogdan Bojko; Bogdan Zdrojewski; Bolesław Borysiuk; Bronisław Dutka; Edward Czesak; Elżbieta Łukacijewska; Eugeniusz Grzeszczak; Franciszek Stefaniuk; Grzegorz Kołacz; Grzegorz Kurczuk; Grzegorz Woźny; Halina Murias; Halina Olendzka; Henryk Smolarz; Ireneusz Raś; Jacek Krupa; Jakub Rutnicki; Jan Bestry; Jan Bury; Jan Łopata; Jan Rokita; Janusz Palikot; Jarosław Rusiecki; Jarosław Stawiarski; Jarosław Urbaniak; Jarosław Wałęsa; Jarosław Żaczek; Jerzy Bielecki; Józef Cepil; Karolina Gajewska; Kazimierz Moskal; Krystyna Skowrońska; Lech Kołakowski; Marek Opioła; Marek Sawicki; Maria Zbyrowska; Marian Daszyk; Mieczysław Aszkiełowicz; Mieczysław Golba; Mieczysław Kasprzak; Mirosław Koźlakiewicz; Renata Beger; Ryszard Kalisz; Sławomir Zawiślak; Stanisław Chmielewski; Stanisław Gawłowski; Stanisław Gorczyca; Stanisław Kalemba; Stanisław Lamczyk; Stanisław Łyżwiński; Stanisław Papież; Stanisław Piosik; Stanisław Rydzoń; Stanisław Stec; Stanisław Szwed; Stanisław Żelichowski; Stanisława Okularczyk; Stanisława Prządka; Tadeusz Plawgo; Tadeusz Sławecki; Tadeusz Woźniak; Wiesław Jędrusik; Wiesław Woda; Władysław Stępień; Włodzimierz Karpiński; Włodzimierz Stępień; Wojciech Pomajda; Wojciech Romaniuk; Wojciech Wilk; Zbigniew Rynasiewicz; Zenon Wiśniewski; Zofia Grabczan
4 28 Andrzej Biernat; Andrzej Fedorowicz; Anita Błochowiak; Arkady Fiedler; Cezary Grabarczyk; Damian Raczkowski; Elżbieta Jankowska; Eugeniusz Czykwin; Genowefa Wiśniowska; Grażyna Tyszko; Jacek Bogucki; Jan Jarota; Jarosław Jagiełło; Jarosław Zieliński; Joanna Skrzydlewska; Józef Klim; Krzysztof Jurgiel; Marek Strzaliński; Piotr Gadzinowski; Piotr Krzywicki; Piotr Misztal; Robert Tyszkiewicz; Ryszard Galla; Sylwester Pawłowski; Szymon Pawłowski; Wojciech Olejniczak; Wojciech Szarama; Wojciech Wierzejski
5 50 Andrzej Czuma; Andrzej Halicki; Andrzej Kłopotek; Andrzej Liss; Andrzej Walkowiak; Anna Sobecka; Antoni Sosnowski; Arkadiusz Litwiński; Domicela Kopaczewska; Grażyna Ciemniak; Grzegorz Napieralski; Henryk Młynarczyk; Iwona Arent; Jacek Kurski; Jacek Piechota; Jan Wyrowiński; Janusz Zemke; Jerzy Szmajdziński; Jerzy Wenderlich; Joachim Brudziński; Jolanta Hibner; Jolanta Szczypińska; Karol Karski; Kazimierz Kleina; Krystian Łuczak; Krystyna Ozga; Krzysztof Zaremba; Lech Kuropatwiński; Lech Szymańczyk; Łukasz Zbonikowski; Magdalena Kochan; Marek Biernacki; Mateusz Piskorski; Mieczysław Łuczak; Mirosław Krajewski; Mirosław Pawlak; Mirosława Masłowska; Rafał Wiechecki; Robert Strąk; Ryszard Kaczyński; Sławomir Jeneralski; Sławomir Nitras; Sławomir Nowak; Sławomir Rybicki; Stanisław Wziątek; Tomasz Lenz; Waldemar Nowakowski; Witold Hatka; Zbigniew Girzyński; Zbigniew Kozak
6 11 Arkadiusz Mularczyk; Jakub Szulc; Jerzy Gosiewski; Kazimierz Plocke; Krzysztof Czarnecki; Krzysztof Maciejewski; Marek Kuchciński; Paweł Kowal; Sandra Lewandowska; Waldemar Pawlak; Witold Czarnecki
7 29 Bogusław Bosak; Bogusław Sobczak; Bogusław Wontor; Bożenna Bukiewicz; Czesław Fiedorowicz; Dawid Jackiewicz; Edward Siarka; Giovanni Roman; Grzegorz Dolniak; Halina Rozpondek; Henryk Gołębiewski; Henryk Siedlaczek; Izabela Mrzygłocka; Janusz Krasoń; Jerzy Materna; Katarzyna Piekarska; Krzysztof Bosak; Leszek Murzyn; Marek Wikiński; Marzena Machałek; Marzena Wróbel; Michał Tober; Mirosław Maliszewski; Roman Giertych; Stanisław Huskowski; Tadeusz Tomaszewski; Waldemar Wiązowski; Witold Bałażak; Wojciech Picheta
8 18 Danuta Jazłowiecka; Jan Kochanowski; Jan Szwarc; Jan Tomaka; Janusz Kołodziej; Julia Pitera; Marek Łatas; Marek Wójcik; Maria Zuba; Rajmund Moric; Robert Ambroziewicz; Stanisław Pięta; Stanisław Zając; Szczepan Skomra; Tomasz Tomczykiewicz; Waldemar Starosta; Zbigniew Chlebowski; Zbyszek Zaborowski

Party membership vs community

Next question is: does the party distribution matches group distribution? To answer this question, for each term I’ll calculate the distribution of party members across groups and also distribution of groups in term of parties.

What is interesting:

  • in 1997-2001 we could observe that majority of KP Prawo i Sprawiedliwość (52%), KP Akcji Wyborczej Solidarność (34%) and KP Sojuszu Lewicy Demokratycznej (32%) were in the same group (2)
  • in 2001-2005 term all groups seems to be mixed apart from group 6 where the majority members of KP Liga Polskich Rodzin (48%), KP Prawo i Sprawiedliwość (35%), KP Ruchu Katolicko-Narodowego (40%) and KP Dom Ojczysty (50%)
  • in 2005-2007 term there is no group that is substanitally different in term of distributuon of party members - modularity does not reflect party membership

1997-2001

nn <- "1997-2001"
pi_communities[[nn]] %>% 
  left_join(un_authors2 %>% filter(period == nn) %>% 
              select(group = stripped, party = ugr2), by = "group") %>% 
  group_by(modularity_class, party) %>% 
  summarise(member_count = n()) %>% 
  ggplot(mapping = aes(y = member_count, fill = party, group = party)) +
  geom_col(aes(x = 1), position = "fill") +
  coord_flip() +
  facet_wrap(~modularity_class) +
  theme_void() +
  theme(legend.position = "right")

pi_communities[[nn]] %>% 
  left_join(un_authors2 %>% filter(period == nn) %>% 
              select(group = stripped, party = ugr2), by = "group") %>% 
  group_by(modularity_class, party) %>% 
  summarise(member_count = n()) %>% 
  pivot_wider(values_fill = 0, id_cols = "party", values_from = "member_count", names_from = "modularity_class") %>% 
  kable() %>% 
  kable_styling()
party 1 2 3 4 5 6 7 8
KP Akcji Wyborczej Solidarność 21 37 13 6 11 14 6 0
KP Alternatywa 2 0 0 0 0 1 0 0
KP Polskiego Stronnictwa Ludowego 9 4 6 2 1 1 0 1
KP Porozumienia Polskiego 2 0 0 2 1 0 0 0
KP Prawo i Sprawiedliwość 3 10 3 0 1 0 1 0
KP Ruchu Odbudowy Polski 1 0 0 0 1 0 0 0
KP Sojuszu Lewicy Demokratycznej 36 86 40 12 48 35 9 7
KP Stronnictwa Konserwatywno-Ludowego 1 2 3 2 0 0 2 0
KP Unii Wolności 2 15 18 3 8 6 3 0
Posłowie niezrzeszeni 5 7 9 4 1 3 1 1
pi_communities[[nn]] %>% 
  left_join(un_authors2 %>% filter(period == nn) %>% 
              select(group = stripped, party = ugr2), by = "group") %>% 
  group_by(modularity_class, party) %>% 
  summarise(member_count = n()) %>% 
  group_by(modularity_class) %>% 
  mutate(mw = round(100 * member_count / sum(member_count, 0))) %>% 
  pivot_wider(values_fill = 0, id_cols = "party", values_from = "mw", names_from = "modularity_class") %>% 
  kable() %>% 
  kable_styling()
party 1 2 3 4 5 6 7 8
KP Akcji Wyborczej Solidarność 26 23 14 19 15 23 27 0
KP Alternatywa 2 0 0 0 0 2 0 0
KP Polskiego Stronnictwa Ludowego 11 2 7 6 1 2 0 11
KP Porozumienia Polskiego 2 0 0 6 1 0 0 0
KP Prawo i Sprawiedliwość 4 6 3 0 1 0 5 0
KP Ruchu Odbudowy Polski 1 0 0 0 1 0 0 0
KP Sojuszu Lewicy Demokratycznej 44 53 43 39 67 58 41 78
KP Stronnictwa Konserwatywno-Ludowego 1 1 3 6 0 0 9 0
KP Unii Wolności 2 9 20 10 11 10 14 0
Posłowie niezrzeszeni 6 4 10 13 1 5 5 11
pi_communities[[nn]] %>% 
  left_join(un_authors2 %>% filter(period == nn) %>% 
              select(group = stripped, party = ugr2), by = "group") %>% 
  group_by(modularity_class, party) %>% 
  summarise(member_count = n()) %>% 
  group_by(party) %>% 
  mutate(mw = round(100 * member_count / sum(member_count), 0)) %>% 
  pivot_wider(values_fill = 0, id_cols = "party", values_from = "mw", names_from = "modularity_class") %>% 
  kable() %>% 
  kable_styling()
party 1 2 3 4 5 6 7 8
KP Akcji Wyborczej Solidarność 19 34 12 6 10 13 6 0
KP Alternatywa 67 0 0 0 0 33 0 0
KP Polskiego Stronnictwa Ludowego 38 17 25 8 4 4 0 4
KP Porozumienia Polskiego 40 0 0 40 20 0 0 0
KP Prawo i Sprawiedliwość 17 56 17 0 6 0 6 0
KP Ruchu Odbudowy Polski 50 0 0 0 50 0 0 0
KP Sojuszu Lewicy Demokratycznej 13 32 15 4 18 13 3 3
KP Stronnictwa Konserwatywno-Ludowego 10 20 30 20 0 0 20 0
KP Unii Wolności 4 27 33 5 15 11 5 0
Posłowie niezrzeszeni 16 23 29 13 3 10 3 3

2001-2005

nn <- "2001-2005"
pi_communities[[nn]] %>% 
  left_join(un_authors2 %>% filter(period == nn) %>% 
              select(group = stripped, party = ugr2), by = "group") %>% 
  group_by(modularity_class, party) %>% 
  summarise(member_count = n()) %>% 
  ggplot(mapping = aes(y = member_count, fill = party, group = party)) +
  geom_col(aes(x = 1), position = "fill") +
  coord_flip() +
  facet_wrap(~modularity_class) +
  theme_void() +
  theme(legend.position = "right")

pi_communities[[nn]] %>% 
  left_join(un_authors2 %>% filter(period == nn) %>% 
              select(group = stripped, party = ugr2), by = "group") %>% 
  group_by(modularity_class, party) %>% 
  summarise(member_count = n()) %>% 
  pivot_wider(values_fill = 0, id_cols = "party", values_from = "member_count", names_from = "modularity_class") %>% 
  kable() %>% 
  kable_styling()
party 1 2 3 4 5 6
KP Konserwatywno-Ludowe 1 0 0 0 4 1
KP Liga Polskich Rodzin 1 0 6 1 3 10
KP Platforma Obywatelska 5 19 3 7 21 22
KP Polskiego Stronnictwa Ludowego 6 10 20 0 8 2
KP Prawo i Sprawiedliwość 7 13 8 3 22 29
KP Ruch Patriotyczny 1 0 2 0 0 0
KP Samoobrona Rzeczypospolitej Polskiej 4 5 47 0 2 27
KP Socjaldemokracji Polskiej 1 8 10 5 12 1
KP Sojuszu Lewicy Demokratycznej 14 62 32 17 34 15
KP Stronnictwa Gospodarczego 2 5 3 1 3 0
KP Unii Pracy 1 2 3 2 2 1
Posłowie niezrzeszeni 1 11 9 2 6 12
KP „Dom Ojczysty” 0 1 3 1 0 5
KP Porozumienia Polskiego 0 0 0 3 0 1
KP Ruchu Katolicko-Narodowego 0 0 0 1 2 2
KP Ruchu Odbudowy Polski 0 0 0 0 1 0
pi_communities[[nn]] %>% 
  left_join(un_authors2 %>% filter(period == nn) %>% 
              select(group = stripped, party = ugr2), by = "group") %>% 
  group_by(modularity_class, party) %>% 
  summarise(member_count = n()) %>% 
  group_by(modularity_class) %>% 
  mutate(mw = round(100 * member_count / sum(member_count, 0))) %>% 
  pivot_wider(values_fill = 0, id_cols = "party", values_from = "mw", names_from = "modularity_class") %>% 
  kable() %>% 
  kable_styling()
party 1 2 3 4 5 6
KP Konserwatywno-Ludowe 2 0 0 0 3 1
KP Liga Polskich Rodzin 2 0 4 2 2 8
KP Platforma Obywatelska 11 14 2 16 18 17
KP Polskiego Stronnictwa Ludowego 14 7 14 0 7 2
KP Prawo i Sprawiedliwość 16 10 5 7 18 23
KP Ruch Patriotyczny 2 0 1 0 0 0
KP Samoobrona Rzeczypospolitej Polskiej 9 4 32 0 2 21
KP Socjaldemokracji Polskiej 2 6 7 12 10 1
KP Sojuszu Lewicy Demokratycznej 32 46 22 40 28 12
KP Stronnictwa Gospodarczego 5 4 2 2 2 0
KP Unii Pracy 2 1 2 5 2 1
Posłowie niezrzeszeni 2 8 6 5 5 9
KP „Dom Ojczysty” 0 1 2 2 0 4
KP Porozumienia Polskiego 0 0 0 7 0 1
KP Ruchu Katolicko-Narodowego 0 0 0 2 2 2
KP Ruchu Odbudowy Polski 0 0 0 0 1 0
pi_communities[[nn]] %>% 
  left_join(un_authors2 %>% filter(period == nn) %>% 
              select(group = stripped, party = ugr2), by = "group") %>% 
  group_by(modularity_class, party) %>% 
  summarise(member_count = n()) %>% 
  group_by(party) %>% 
  mutate(mw = round(100 * member_count / sum(member_count), 0)) %>% 
  pivot_wider(values_fill = 0, id_cols = "party", values_from = "mw", names_from = "modularity_class") %>% 
  kable() %>% 
  kable_styling()
party 1 2 3 4 5 6
KP Konserwatywno-Ludowe 17 0 0 0 67 17
KP Liga Polskich Rodzin 5 0 29 5 14 48
KP Platforma Obywatelska 6 25 4 9 27 29
KP Polskiego Stronnictwa Ludowego 13 22 43 0 17 4
KP Prawo i Sprawiedliwość 9 16 10 4 27 35
KP Ruch Patriotyczny 33 0 67 0 0 0
KP Samoobrona Rzeczypospolitej Polskiej 5 6 55 0 2 32
KP Socjaldemokracji Polskiej 3 22 27 14 32 3
KP Sojuszu Lewicy Demokratycznej 8 36 18 10 20 9
KP Stronnictwa Gospodarczego 14 36 21 7 21 0
KP Unii Pracy 9 18 27 18 18 9
Posłowie niezrzeszeni 2 27 22 5 15 29
KP „Dom Ojczysty” 0 10 30 10 0 50
KP Porozumienia Polskiego 0 0 0 75 0 25
KP Ruchu Katolicko-Narodowego 0 0 0 20 40 40
KP Ruchu Odbudowy Polski 0 0 0 0 100 0

2005-2007

nn <- "2005-2007"
pi_communities[[nn]] %>% 
  left_join(un_authors2 %>% filter(period == nn) %>% 
              select(group = stripped, party = ugr2), by = "group") %>% 
  group_by(modularity_class, party) %>% 
  summarise(member_count = n()) %>% 
  ggplot(mapping = aes(y = member_count, fill = party, group = party)) +
  geom_col(aes(x = 1), position = "fill") +
  coord_flip() +
  facet_wrap(~modularity_class) +
  theme_void() +
  theme(legend.position = "right")

pi_communities[[nn]] %>% 
  left_join(un_authors2 %>% filter(period == nn) %>% 
              select(group = stripped, party = ugr2), by = "group") %>% 
  group_by(modularity_class, party) %>% 
  summarise(member_count = n()) %>% 
  pivot_wider(values_fill = 0, id_cols = "party", values_from = "member_count", names_from = "modularity_class") %>% 
  kable() %>% 
  kable_styling()
party 1 2 3 4 5 6 7 8
KP Liga Polskich Rodzin 11 2 3 6 4 0 7 1
KP Platforma Obywatelska 71 39 35 12 26 3 16 9
KP Polskiego Stronnictwa Ludowego 3 1 28 0 17 2 1 0
KP Prawica Rzeczypospolitej 2 1 0 0 0 0 0 0
KP Prawo i Sprawiedliwość 63 39 27 7 20 9 10 6
KP Ruch Ludowo-Narodowy 1 2 0 0 1 0 0 0
KP Samoobrona Rzeczypospolitej Polskiej 11 12 18 7 3 1 0 2
KP Sojuszu Lewicy Demokratycznej 8 8 20 9 14 0 13 4
Posłowie niezrzeszeni 10 1 7 4 1 0 2 0
pi_communities[[nn]] %>% 
  left_join(un_authors2 %>% filter(period == nn) %>% 
              select(group = stripped, party = ugr2), by = "group") %>% 
  group_by(modularity_class, party) %>% 
  summarise(member_count = n()) %>% 
  group_by(modularity_class) %>% 
  mutate(mw = round(100 * member_count / sum(member_count, 0))) %>% 
  pivot_wider(values_fill = 0, id_cols = "party", values_from = "mw", names_from = "modularity_class") %>% 
  kable() %>% 
  kable_styling()
party 1 2 3 4 5 6 7 8
KP Liga Polskich Rodzin 6 2 2 13 5 0 14 5
KP Platforma Obywatelska 39 37 25 27 30 20 33 41
KP Polskiego Stronnictwa Ludowego 2 1 20 0 20 13 2 0
KP Prawica Rzeczypospolitej 1 1 0 0 0 0 0 0
KP Prawo i Sprawiedliwość 35 37 20 16 23 60 20 27
KP Ruch Ludowo-Narodowy 1 2 0 0 1 0 0 0
KP Samoobrona Rzeczypospolitej Polskiej 6 11 13 16 3 7 0 9
KP Sojuszu Lewicy Demokratycznej 4 8 14 20 16 0 27 18
Posłowie niezrzeszeni 6 1 5 9 1 0 4 0
pi_communities[[nn]] %>% 
  left_join(un_authors2 %>% filter(period == nn) %>% 
              select(group = stripped, party = ugr2), by = "group") %>% 
  group_by(modularity_class, party) %>% 
  summarise(member_count = n()) %>% 
  group_by(party) %>% 
  mutate(mw = round(100 * member_count / sum(member_count), 0)) %>% 
  pivot_wider(values_fill = 0, id_cols = "party", values_from = "mw", names_from = "modularity_class") %>% 
  kable() %>% 
  kable_styling()
party 1 2 3 4 5 6 7 8
KP Liga Polskich Rodzin 32 6 9 18 12 0 21 3
KP Platforma Obywatelska 34 18 17 6 12 1 8 4
KP Polskiego Stronnictwa Ludowego 6 2 54 0 33 4 2 0
KP Prawica Rzeczypospolitej 67 33 0 0 0 0 0 0
KP Prawo i Sprawiedliwość 35 22 15 4 11 5 6 3
KP Ruch Ludowo-Narodowy 25 50 0 0 25 0 0 0
KP Samoobrona Rzeczypospolitej Polskiej 20 22 33 13 6 2 0 4
KP Sojuszu Lewicy Demokratycznej 11 11 26 12 18 0 17 5
Posłowie niezrzeszeni 40 4 28 16 4 0 8 0

Words, network measures

What about used words? For each modularity group let see 10 used words.

do.call(rbind, 
        lapply(X = period_bands$period,
               FUN = function(x){
                 res <- InterpretText(pi_networks[[x]], prepped_tagged[[x]]) %>% 
                   group_by(modularity_class) %>% 
                   unique() %>% 
                   top_n(n = 10) %>% 
                   summarise(lemmas = paste0(lemma, collapse = "; "))
                 cbind(data.frame(period = x), res)
               })) %>% 
  pivot_wider(id_cols = "modularity_class", names_from = "period", values_from = "lemmas", values_fill = "") %>% 
  kable() %>% 
  kable_styling()
modularity_class 1997-2001 2001-2005 2005-2007
1 famarol; rosjanin; goplana; malbork; suseł; świdnik; bank; poznań; r; romet barlinek; butel; gaz; płynny; rzymełka; niezawiniony; zawinić; czeczeński; metanowy; powietrzno radiokomunikacyjny; szrajber; starogard; rezydent; stażysta; piłkarz; kwidzyn; ferie; bitum; kłak
2 anestezjologiczny; głodować; stocznia; konwencja; lustracyjny; pełnomocny; ciaciura; rozwarowskich; farmaceutyczny; otyłość alimenty; isbn; piechociński; tetra; błona; pa; stuligrosz; tkanka; pawlak; petycja wopr; dystrybucyjny; operator; szlachta; dywidenda; kghm; ppk; bodaczowie; nitron
3 przyuczyć; ubój; zwierzę; skraść; blacha; składak; zagęścić; czsp; koza; srm stado; gryfice; kłopotek; cement; paździor; stanibuła; pelplin; gajda; szukała; mazowsze jeleniowaty; technologiczny; spersonalizować; stec; okularczyk; banasiński; konkur; uokik; stępień; leżajsk
4 sąd; rolnik; konin; dębica; tarnów; mswia; stanibuła; wagon; wagonownia dziernika; funkcjonariusz; ozdrowieć; psp; jbr; koleje; pkp; oddłużać; rzepinies; lh kult; mańka; kurczuk; stawiarski; żaczek; płock; teresin; ciechanów; cukrownia
5 opona; tomaszewska; paździor; koźle; kędzierzyn; mniejszość; michalik; pracownia; hektolitr; chełm bolek; miligram; tabl; konny; sosnowska; johnson; dawca; szpik; sylwia; podopieczny corporation; microsoft; lot; pilot; powietrzny; karykatura; statek; bumar; wenderlich; taksówka
6 deputat; filek; fpnp; janik; kwalifikacyjny; lech; pastwa; emerytalny; fundacja; kombatant chwastek; mon; sybirak; msf; urtip; wiorin; kabel; gadzinowski; prokurator; rpp czołowy; demokrata; lewica; socjaldemokracja; ugrupowanies; kobieta; mężczyzna; bogucki; gadzinowski; salon
7 strefa; międzystrefowy; numeryczny; łączność; szewc; telekomunikacyjny; maćkała; martyniuk; numeracyjny; telefoniczny swarożynies; chojnice; pżm; egzamin; eksternistyczny; mińsk; be; pzm; pomorski skm; mrzygłocka; radom; grójec; s7; powodziowy; zalać; specustawa; bałażak; warlubie
10 domicela; kopaczewska; włocławek; superfo; łuczak; lustracyjny; spikz
8 bogusław; bosak; czarnecki; dekret; las; pkwn; trzcianka; wyzwolenies; zabrać
9 janik; loto; rafineria; robert; siedcle; celny; martyniuk; zjednoczenies; chlebowski; wałbrzych

Betweenness centrality - this measure can show which parliamentarians are consistently central to the interpellation network, indicating their significant role in shaping debates, garnering support for policies, and influencing legislative outcomes. The higher the measure, the more control has this parliamentarian.

For each period I’ve calculated (and scaled) betweenness centrality for each member. Than I’ve focus only on those parliamentarians which were present in all periods and limit to top 10.

There was no parliamentarian that had scaled betweenness centrality greater than 0 in all periods. We might see how the role of each politician shifted e.g. Grzegorz Schetyna had very high (scaled) betweenness centrality in first term, then had above an average in second and below an average in third term.

do.call(rbind, 
        lapply(X = period_bands$period,
               FUN = function(x){
                 res <- TextCentrality(pi_networks[[x]]) %>% 
                   mutate(bc = scale(betweenness_centrality))
                 res$member <- row.names(res)
                 row.names(res) <- NULL
                 cbind(data.frame(period = x), res)
               })) %>% 
  group_by(member) %>% 
  mutate(count = n(), mbb = mean(bc)) %>% 
  filter(count == 3) %>% 
  ungroup() %>% 
  top_n(n = length(period_bands$period) * 10, wt = mbb) %>% 
  pivot_wider(id_cols = "member", names_from = "period", values_from = "bc") %>% 
  kable() %>% 
  kable_styling()
member 1997-2001 2001-2005 2005-2007
Ewa Janik -0.488279448 1.2529359 2.5067183
Grzegorz Schetyna 3.851158108 0.6981663 -0.6342410
Jerzy Wenderlich -0.670122546 3.0293792 -0.6080226
Marek Sawicki 1.156574025 -0.9897499 0.4354680
Marek Wikiński -0.810637666 1.7486875 0.6661896
Piotr Gadzinowski -0.141124444 0.7748897 -0.5293676
Szczepan Skomra -0.256842778 0.7807915 0.6085092
Tadeusz Cymański 0.883809379 -0.8422048 1.7201676
Tadeusz Iwiński 0.007656273 0.6096392 -0.5398549
Tadeusz Jarmuziewicz 0.371342468 -0.4999001 6.0881461

Another way to measure impact/centrality of politicians is closeness centrality. That approach yielded very similar results: 8 of the selected in this way politicians were also chosen based on betweeness centrality measure.

do.call(rbind, 
        lapply(X = period_bands$period,
               FUN = function(x){
                 res <- TextCentrality(pi_networks[[x]]) %>% 
                   mutate(cc = scale(closness_centrality))
                 res$member <- row.names(res)
                 row.names(res) <- NULL
                 cbind(data.frame(period = x), res)
               })) %>% 
  group_by(member) %>% 
  mutate(count = n(), mcc = mean(cc)) %>% 
  filter(count == 3) %>% 
  ungroup() %>% 
  top_n(n = length(period_bands$period) * 10, wt = mcc) %>% 
  pivot_wider(id_cols = "member", names_from = "period", values_from = "cc") %>% 
  kable() %>% 
  kable_styling()
member 1997-2001 2001-2005 2005-2007
Ewa Janik -0.19305257 1.13989622 1.29011974
Grzegorz Schetyna 2.08147153 0.38476245 -1.02344870
Janusz Dobrosz 0.43950304 0.80584876 0.02467894
Katarzyna Piekarska 0.80742959 0.04290411 0.43986841
Marek Sawicki 1.25818325 -0.91353621 0.95482793
Marek Wikiński 0.06462653 1.34572690 1.12509467
Stanisław Kalemba 0.39603871 -0.26885648 0.79925652
Szczepan Skomra 0.34859813 0.85821315 0.16649977
Tadeusz Cymański 0.89343694 -1.30656854 1.62387447
Tadeusz Jarmuziewicz 0.80134418 -1.16195382 3.19718631

Evaluation

The text mining project effectively analyzed networks formed by member of parliament interpellations, revealing intricate connections and patterns within political discourse. However, further exploration into the implications of these network structures for decision-making processes could enhance the project’s impact and relevance.

Summary

  1. Was the purpose achieved?

The purpose of the project was achieved - networks that emerged from politicians interpollations were discovered. I’ve managed to extract important information (date, author) that enabled to give additional context to the data.

  1. Were the assumptions examined?

First assumption: There exists a core group of parliamentarians who are consistently central to the interpellation network, indicating their significant role in shaping debates, garnering support for policies, and influencing legislative outcomes.

I believe I’ve proven this by showing top members in terms of centrality measures. Additionally I provided the evidence of forming specific subgroups.

Second assumption: There is a tendency for same party members to be close in text network.

I’ve provided an evidence to support that claim by measuring the strength of connections between political members using graph representation. On the other hand the distribution regarding modularity classes was similar to distribution of the whole parliament.

  1. Conclusion

Interpellations of the Polish Parliament Members is a great dataset for text mining purposes. Based on the data from 3 terms, form 1997 to 2007, the analysis proved that is certain centrality in political discourse. The more recent the term, the more interpellation there were which makes me certain that analysing recent terms would provide more robust results.

Appendix with source code and data set

All the code is available at my Github repository